#include <queue>
#include <unordered_map>
#include <vector>
using namespace std;

class Solution
{
public:
    static vector<int> findOrder(int numCourses, vector<vector<int>>& prerequisites)
    {
        vector<int> rv;
        unordered_map<int, vector<int>> hash;
        vector<int> in(numCourses);

        for(auto& e : prerequisites)
        {
            int a = e[0], b = e[1];
            hash[b].emplace_back(a);
            in[a]++;
        }

        queue<int> q;
        for(int i=0; i<numCourses; i++)
        {
            if(in[i]==0)
            {
                q.emplace(i);
                rv.emplace_back(i);
            }
        }

        while(!q.empty())
        {
            int t = q.front();
            q.pop();
            for(int e : hash[t])
            {
                in[e]--;
                if(in[e]==0)
                {
                    q.emplace(e);
                    rv.emplace_back(e);
                }
            }
        }

        for(int e : in)
            if(e)
                return {};
        return rv;
    }
};
